#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <time.h>

#include <stdint.h>

// 滤波器状态变量（静态存储保证连续性）
static int16_t prev_output = 0;  // 上一次输出值
static uint16_t alpha_numerator = 0;  // alpha分子（整数运算优化）

// 初始化滤波器参数（根据截止频率计算）
void filter_init(uint32_t sample_rate, uint32_t cutoff_freq) {
    float rc = 1.0f / (2.0f * 3.14159265358979323846f * cutoff_freq);
    float dt = 1.0f / sample_rate;
    float alpha = dt / (rc + dt);

    // 转换为定点数运算参数（Q15格式）
    alpha_numerator = (uint16_t)(alpha * 32767.0f + 0.5f);  // 保留15位小数
}

// 滤波处理函数（原地修改输入数组）
void low_pass_filter(int16_t *data, int length) {

}

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->comboBox->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->comboBox->addItem(info.portName());
    }
    this->setMaximumSize(430,531);
    this->setMinimumSize(430,531);
    //连接信号和槽
    QObject::connect(&serial, &QSerialPort::readyRead, this, &MainWindow::serialPort_readyRead);
    aud.setCurrentSampleInfo(24000,16,1);
    filter_init(16000,8000);
    aud.setCurrentVolumn(1);
    aud.start();
}

MainWindow::~MainWindow()
{
    delete ui;
}

//监测串口
void MainWindow::on_pushButton_3_clicked()
{
    ui->comboBox->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        ui->comboBox->addItem(info.portName());
    }
}
//打开串口
void MainWindow::on_pushButton_4_clicked()
{
    if(ui->pushButton_4->text()==QString("打开串口"))
     {
         //设置串口名
         serial.setPortName(ui->comboBox->currentText());
         //设置波特率
         serial.setBaudRate(921600);
         //设置数据位数
         switch(ui->comboBox_3->currentIndex())
         {
         case 8: serial.setDataBits(QSerialPort::Data8); break;
         default: break;
         }
         //设置奇偶校验
         switch(ui->comboBox_4->currentIndex())
         {
         case 0: serial.setParity(QSerialPort::NoParity); break;
         default: break;
         }
         //设置停止位
         switch(ui->comboBox_5->currentIndex())
         {
         case 1: serial.setStopBits(QSerialPort::OneStop); break;
         case 2: serial.setStopBits(QSerialPort::TwoStop); break;
         default: break;
         }
         //设置流控制
         serial.setFlowControl(QSerialPort::NoFlowControl);
         //打开串口
         if(!serial.open(QIODevice::ReadWrite))
         {
             QMessageBox::about(NULL,"提示","无法打开串口!");
             return;
         }
         //下拉菜单控件失能
         ui->comboBox->setEnabled(false);
         ui->comboBox_2->setEnabled(false);
         ui->comboBox_3->setEnabled(false);
         ui->comboBox_4->setEnabled(false);
         ui->comboBox_5->setEnabled(false);
         ui->pushButton_4->setText(QString("关闭串口"));
         //发送按键使能
         ui->pushButton_2->setEnabled(true);
     }
     else
     {
         //关闭串口
         serial.close();
         //下拉菜单控件使能
         ui->comboBox->setEnabled(true);
         ui->comboBox_2->setEnabled(true);
         ui->comboBox_3->setEnabled(true);
         ui->comboBox_4->setEnabled(true);
         ui->comboBox_5->setEnabled(true);
         ui->pushButton_4->setText(QString("打开串口"));
         //发送按键失能
         ui->pushButton_2->setEnabled(false);
     }
}
//发送数据
void MainWindow::on_pushButton_2_clicked()
{
    //获取界面上的数据并转换成utf8格式的字节流
    QByteArray data = ui->textEdit_2->toPlainText().toUtf8();
    char p[] = "9999";
    senddata(p,4);
    //serial.write(data);
}
//清空接收
void MainWindow::on_pushButton_clicked()
{
    path = QFileDialog::getOpenFileName(this,"open","../");
    if(path.isEmpty() == true)
    {
        cout<<"未选择文件";
        //ui->textEditread->append("取消选择");
        return;
    }
    //获取文件信息
    filename.clear();
    //清除文件名
    QFileInfo info(path);
    filename = info.fileName();
    filesize = info.size();
    sendSize = 0;
    //指定文件名字
    file.setFileName(path);
    bool isok = file.open(QIODevice::ReadOnly);
    if(false == isok)
    {
        if(file.isOpen())
            file.close();
        isok = file.open(QIODevice::ReadOnly);
        if(false == isok)
            cout<<"打开文件失败";
        return;
    }
   ui->textEdit->clear();
    cout<<"打开文件";
    cout<<file.size();
}

//串口接收
void MainWindow::senddata(char *data, qint64 len)
{
    QByteArray arry ;
    arry.append(0X7F);
    arry.append(0X02);
    serial.write(arry.data());
    len = serial.write(data,len);
    arry.clear();
    arry.append(0X7F);
    arry.append(0X03);
    serial.write(arry.data());
}
void MainWindow::serialPort_readyRead()
{
    //从接收缓冲区中读取数据
    QByteArray arry = serial.readAll();
//    char *pout = new char[arry.length()];
//    memcpy(pout, arry.data(), arry.length());
//    uint16_t* data = (uint16_t*)pout;
//    //low_pass_filter(p16, sizeof(p16)/sizeof(p16[0]));
//    int length = arry.length()/2;
//    {
//        static uint16_t loacout = 0;
//        for (int i = 0; i < length; i++) {
//            // 差分方程：y[n] = alpha * x[n] + (1-alpha) * y[n-1]
//            int32_t temp = (int32_t)data[i] * 0.5 +
//                          (int32_t)prev_output * 0.5;

//            prev_output = (int16_t)(temp);  // 右移15位恢复Q15格式
//              // 右移15位恢复Q15格式
//            qDebug()<<abs(data[i]);
//            if (abs(data[i]) < 2040) {
//                //if(i)
//                data[i] = loacout;  // 静音处理
//            }
//            else {
//                data[i] = prev_output;  // 此处为滤波后输出
//                loacout = prev_output;
//            }
//        }
//    }
    aud.addAudioBuffer(arry.data(),arry.length());
//    delete [] pout;
}




